package com.atguigu.principle.demeter.improve;

import java.util.ArrayList;
import java.util.List;

/**
 * @author gcq
 * @Create 2020-09-29
 */
// 客户端
public class Demter {

    public static void main(String[] args) {
        System.out.println("使用迪米特法则改进");
        SchoolManager schoolManager = new SchoolManager();
        schoolManager.printAllEmployee(new CollegeManager());
    }
}

// 学校总部员工类
class Employee {
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

// 学院员工类
class CollegeEmployee {
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

// 学院管理类
class CollegeManager {
    // 返回学院所有员工
    public List<CollegeEmployee> getAllEmployee() {
        List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
        // 增加了10个员工到list集合
        for(int i = 0; i < 10; i++) {
            CollegeEmployee emp = new CollegeEmployee();
            emp.setId("学院员工id=" + i);
            list.add(emp);
        }
        return list;
    }
    // 输出学院员工信息
    public void printEmployee() {
        List<CollegeEmployee> list1 = getAllEmployee();
        System.out.println("---------------分公司员工----------------");
        for (CollegeEmployee e: list1) {
            System.out.println(e.getId());
        }
    }
}

// 分析 SchoolManager 类的直接朋友类有那些 Employee CollegeManager
// CollegeEmployee 不是直接朋友而是一个陌生类，违反了迪米特法则
// 学校管理类
class SchoolManager {
    // 返回学校总部的员工
    public List<Employee> getAllEmployee() {
        List<Employee> list = new ArrayList<Employee>();
        for(int i = 0; i < 5; i++) {
            Employee emp = new Employee();
            emp.setId("学校员工id=" + i);
            list.add(emp);
        }
        return list;
    }
    // 该方法完成输出学校总部和学院员工的信息id
    void printAllEmployee(CollegeManager sub) {
        // 分析问题
        // 1、这里的CollegeEmployee 不是 SchoolManager 直接朋友
        //  2、CollegeEmployee 是以局部变量的方式出现在 SchoolManager
        // 3、违反了迪米特法则

        // 将输出学院的员工方法，封装到 CollegeManager
        // 获取到学院员工
        sub.printEmployee();

        // 获取到学校总部员工
        List<Employee> list2 = this.getAllEmployee();
        System.out.println("---------------学校总部员工---------------");
        for (Employee e : list2) {
            System.out.println(e.getId());
        }
    }
}